// use std::borrow::Cow ;
// 
// use anyhow::{Result,bail} ;
// use clap::{Parser,Subcommand,command} ;
// 
// 
// #[derive(Parser)]  // clap的Parser派生宏来自动为Args结构体生成命令行参数解析逻辑，这使得Args结构体成为一个命令行参数解析器可以通过命令行参数来填充其字段
// #[command(name = "Ji" , about , long_about = None)]  // 用于配置命令行程序的基本信息 比如程序名称描述等  name设置程序的名称 about使用默认的描述信息 通常通过Cargo.toml文件的描述字段获取  long_about是None 表示不使用长描述
// pub (super) struct Args {  // 限定访问范围
//     #[command(subcommand)]  // command是clap的属性宏 将command字段标记成一个子命令
//     pub (super) command : Command,  // pub(sub) 只能被父级一层访问  Command类型是一个枚举 通常用Subcommand来定义
// 
//     #[arg(short='V' , long)]  // clap的一个属性宏  short配置短参数  long配置长参数  long没有具体指，会将字段名字的LowerCamelCase作为长参数名
//     pub (super) version : bool ,  // 派生宏Parser已经包含了对command和arg的调用 不需要use引入
// }
// 
// /**
// pub(crate): 表示程序项在 当前crate（包）内 可见，但不能被其他crate访问。
// pub(in path): 表示程序项在指定的 路径（模块层次结构） 内可见，path 必须是声明其可见性的程序项的祖先模块。
// pub(self): 表示程序项在 当前模块内 可见，相当于不使用任何可见性限定符。
// */
// 
// #[derive(Subcommand)]  // 为枚举生成子命令的参数解析代码  clap会为每一个枚举变体生成相应的子命令 并解析传递给这些子命令的参数
// pub (super) enum Command { // 这个枚举只在父模块内部可见
//     // Subcommand 要求每一个枚举变体关联一个结构体，结构体用于定义子命令的参数
//     Emit(CommandEmit) , // 子命令emit  参数通过CommandEmit定义
//     EmitTo(CommandEmitTo) ,
//     Pack(CommandPack) ,
//     Pub(CommandPub) ,
//     PubTo(CommandPubTo) ,
//     Sub(CommandSub) ,
// }
// 
// #[derive(clap::Args)]  // clap自动为结构体的每一个字段生成相应的命令行参数
// pub (super) struct CommandEmit{
//     /// the name of the command
//     pub (super) name :String ,
// 
//     /// the args of the command
//     #[arg(allow_hyphen_values=true , trailing_var_arg=true)] // 存储命令行参数 allow_hyphen_values 允许参数值中包含连字符 trailing_var_arg标记为可变数量的尾随参数 所有未被其他参数匹配的值被收集到这个字段
//     pub(super) args : Vec<String> ,
// }
// 
// #[derive((clap::Args))]
// pub (super) struct CommandEmitTo{
//     // 接受者id
//     pub (super) receiver : u64 ,
//     // 命令名
//     pub (super) name : String ,
//     // 命令参数
//     #[arg(allow_hyphen_values = true , trailing_var_arg=true)]
//     pub(super) args : Vec<String> ,
// }
// 
// #[derive(clap::Args)]
// pub (super) struct CommandPub{
//     #[arg(index=1)]
//     pub (super) kind : String ,
// 
//     #[arg(long)]
//     pub (super) str : Option<String> ,
// 
//     #[arg(long)]
//     pub (super) json : Option<String> ,
// 
//     #[arg(long, num_args = 0..)]
//     pub (super) list : Vec<String> ,
// }
// 
// 
// #[derive(clap::Args)]
// #[command(arg_required_else_help = true)]
// pub(super) struct CommandPack {
//     /// Add a package.
//     #[arg(short = 'a', long)]
//     pub(super) add:     Option<String>,
//     /// Install all packages.
//     #[arg(short = 'i', long)]
//     pub(super) install: bool,
//     /// List all packages.
//     #[arg(short = 'l', long)]
//     pub(super) list:    bool,
//     /// Upgrade all packages.
//     #[arg(short = 'u', long)]
//     pub(super) upgrade: bool,
// }
// 
// #[derive(clap::Args)]
// pub(super) struct CommandPub {
//     /// The kind of message.
//     #[arg(index = 1)]
//     pub(super) kind: String,
//     /// Send the message with a string body.
//     #[arg(long)]
//     pub(super) str:  Option<String>,
//     /// Send the message with a JSON body.
//     #[arg(long)]
//     pub(super) json: Option<String>,
//     /// Send the message as string of list.
//     #[arg(long, num_args = 0..)]
//     pub(super) list: Vec<String>,
// }
// 
// impl CommandPub {
//     #[allow(dead_code)]
//     pub(super) fn receiver() -> Result<u64> {
//         if let Some(s) = std::env::var("YAZI_PID").ok().filter(|s| !s.is_empty()) {
//             Ok(s.parse()?)
//         } else {
//             bail!("No `YAZI_ID` environment variable found.")
//         }
//     }
// }
// 
// #[derive(clap::Args)]
// pub(super) struct CommandPubTo {
//     /// The receiver ID.
//     #[arg(index = 1)]
//     pub(super) receiver: u64,
//     /// The kind of message.
//     #[arg(index = 2)]
//     pub(super) kind:     String,
//     /// Send the message with a string body.
//     #[arg(long)]
//     pub(super) str:      Option<String>,
//     /// Send the message with a JSON body.
//     #[arg(long)]
//     pub(super) json:     Option<String>,
//     /// Send the message as string of list.
//     #[arg(long, num_args = 0..)]
//     pub(super) list:     Vec<String>,
// }
// 
// #[derive(clap::Args)]
// pub(super) struct CommandSub {
//     /// The kind of messages to subscribe to, separated by commas if multiple.
//     #[arg(index = 1)]
//     pub(super) kinds: String,
// }
// 
// // TODO 转移到ji-macro中
// macro_rules! impl_emit_body {
//     ($name:ident) => {
//         impl $name {
//             #[allow(dead_code)]
//             pub (super) fn body(self) -> Result<String> {
//                 Ok(serde_json::to_string(&(self.name,Cmd::parse_args(self.args.into_inter() , false)?))?)
//             }
//         }
//     };
// }
// 
// macro_rules! impl_pub_body {
//     ($name:ident) => {
//         impl $name {
//             #[allow(dead_code)]
//             pub (super) fn body(&self) -> Result<Cow<str>> {
//                 Ok(if let Some(json) = &self.json {
//                     json.into()
//                 }else if let Some(str) = &self.str{
//                     serde_json::to_string(str)?.into()
//                 }else if !self.list.is_empty() {
//                     serde_json::to_string(&self.list)?.into()
//                 }else {
//                     "".into()
//                 })
//             }
//         }
//     };
// }
// 
// impl_emit_body!(CommandEmit);
// impl_emit_body!(CommandEmitTo) ;
// 
// impl_pub_body!(CommandPub) ;
// impl_pub_body!(CommandPubTo) ;
// 
// 
